package main.leetcode.primary.from301to400;

import java.util.Arrays;

/**
 * 322. 零钱兑换
 *
 * <p>给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额，返回 -1。
 *
 * <p>示例 1: 输入: coins = [1, 2, 5], amount = 11 输出: 3 解释: 11 = 5 + 5 + 1
 *
 * <p>示例 2: 输入: coins = [2], amount = 3 输出: -1
 *
 * <p>说明: 你可以认为每种硬币的数量是无限的。
 */
public class ex322 {
    public static void main(String[] args) {
        System.out.println(new ex322().coinChange(new int[] {1, 2, 5}, 11));
    }

    public int coinChange(int[] coins, int amount) {
        int[] dp = new int[amount + 1];
        Arrays.fill(dp, amount + 1);
        dp[0] = 0;
        for (int coin : coins) {
            for (int i = coin; i <= amount; ++i) {
                // 加上当前硬币
                dp[i] = Math.min(dp[i], dp[i - coin] + 1);
            }
        }
        return dp[amount] == amount + 1 ? -1 : dp[amount];
    }
}
